package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	//创建一个默认的Gin实例
	r := gin.Default()
	// 处理GET请求的路由
	// 该路由响应根路径 ("/") 的GET请求
	r.GET("/", func(c *gin.Context) {
		// 返回JSON响应
		// 使用HTTP状态码200表示请求成功
		// 使用gin.H构造一个包含"message"字段的JSON对象，值为"hello world"
		c.String(200, "Get: hello world")
	})

	r.POST("/", func(c *gin.Context) {
		c.String(200, "Post: hello world")
	})

	r.PUT("/", func(c *gin.Context) {
		c.String(200, "Put: hello world")
	})

	r.DELETE("/", func(c *gin.Context) {
		c.String(200, "Delete: hello world")
	})

	//获取url传值,/echo?name=zhangsan
	r.GET("/echo", func(c *gin.Context) {
		str := c.Query("name")
		c.String(200, str)
	})

	// 在Gin框架中，动态路由指的是能够根据请求中的参数动态匹配路径的路由机制。
	// 这种路由允许你在定义路由时使用占位符（也称为参数或变量），
	// 这些占位符可以在实际请求到来时被具体的值所替换。这使得创建灵活且可扩展的API变得非常容易。
	// 动态路由的基本语法是通过在路径中添加带有冒号的标识符来实现的。例如：
	// r.GET("/user/:name", func(c *gin.Context) {
	// 	name := c.Param("name")
	// 	c.String(200, "Hello %s", name)
	// })
	// 在这个例子中，:name是一个动态参数，它会匹配URL路径中/user/后面的任何字符串，
	// 并将其作为id参数传递给处理函数。你可以通过c.Param("id")来获取这个参数的具体值。
	// 除了简单的参数外，Gin还支持带正则表达式的动态路由，这样可以更精确地控制哪些URL模式可以被匹配。
	// 例如：
	// 启动HTTP服务器并监听在9000端口,默认在8080
	r.GET("/user/:id", func(c *gin.Context) {
		id := c.Param("id")
		c.String(http.StatusOK, "User ID (number): %s", id)
	})
	// 此外，Gin还提供了*和**这样的通配符用于路径匹配：

	// *：匹配任意单个路径段（即直到下一个斜杠之前的所有字符）。
	// **：匹配任意数量的路径段，包括零个或多个斜杠。
	// 匹配 /files/hello.txt
	r.GET("/files/*file", func(c *gin.Context) {
		file := c.Param("file")
		c.String(http.StatusOK, "Filepath: %s", file)
	})

	// 不同返回值类型
	r.GET("/json", func(c *gin.Context) {
		// gin.H 是 map[string]interface{}的缩写
		// 方式一：自己拼接 JSON
		c.JSON(http.StatusOK, gin.H{
			"message": "hello world",
		})
		// 方式二：使用结构体
		type msg struct {
			Name    string `json:"name"`
			Age     int    `json:"age"`
			Message string `json:"message"`
		}
		m := msg{
			Name:    "zhangsan",
			Age:     18,
			Message: "hello world",
		}
		c.JSON(http.StatusOK, m)
	})

	r.Run(":9000")
}
